package com.example.designpatterns.singleton;

/**
 * SingletonDemo类 - 单例模式演示
 */
public class SingletonDemo {
    public static void main(String[] args) {
        System.out.println("===== 饿汉式单例演示 =====");
        // 饿汉式单例在类加载时就已初始化
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        singleton1.doSomething();
        // 验证是否是同一个实例
        System.out.println("是否是同一个实例：" + (singleton1 == singleton2));
        
        System.out.println("\n===== 懒汉式单例演示 =====");
        // 懒汉式单例在第一次调用getInstance时才初始化
        LazySingleton lazySingleton1 = LazySingleton.getInstance();
        LazySingleton lazySingleton2 = LazySingleton.getInstance();
        lazySingleton1.doSomething();
        // 验证是否是同一个实例
        System.out.println("是否是同一个实例：" + (lazySingleton1 == lazySingleton2));
        
        System.out.println("\n===== 枚举单例演示 =====");
        // 枚举单例
        EnumSingleton enumSingleton1 = EnumSingleton.INSTANCE;
        EnumSingleton enumSingleton2 = EnumSingleton.INSTANCE;
        enumSingleton1.doSomething();
        // 验证是否是同一个实例
        System.out.println("是否是同一个实例：" + (enumSingleton1 == enumSingleton2));
        
        System.out.println("\n===== 静态内部类单例演示 =====");
        // 静态内部类单例在第一次调用getInstance时才初始化
        StaticInnerClassSingleton staticSingleton1 = StaticInnerClassSingleton.getInstance();
        StaticInnerClassSingleton staticSingleton2 = StaticInnerClassSingleton.getInstance();
        staticSingleton1.doSomething();
        // 验证是否是同一个实例
        System.out.println("是否是同一个实例：" + (staticSingleton1 == staticSingleton2));
        
        System.out.println("\n===== 多线程环境下的单例测试 =====");
        // 创建多个线程同时获取单例实例
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                LazySingleton instance = LazySingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + " 获取到的实例：" + instance);
            }, "Thread-" + i).start();
        }
    }
} 